package cn.mayday.algorithms.year2021.month1.E栈专题;

import java.util.Stack;

/**
 * 【简单】
 * <p>
 * 232. 用栈实现队列
 * 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作（push、pop、peek、empty）：
 * <p>
 * 实现 MyQueue 类：
 * <p>
 * void push(int x) 将元素 x 推到队列的末尾
 * int pop() 从队列的开头移除并返回元素
 * int peek() 返回队列开头的元素
 * boolean empty() 如果队列为空，返回 true ；否则，返回 false
 *
 * @author Mayday05
 * @date 2021/5/14 14:06
 */
public class Leetcode232StackToQueue {


    public static void main(String[] args) {

    }

    Stack<Integer> stack1;
    Stack<Integer> stack2;

    /**
     * Initialize your data structure here.
     */
    public Leetcode232StackToQueue() {
        stack1 = new Stack<Integer>();
        stack2 = new Stack<Integer>();
    }

    /**
     * Push element x to the back of queue.
     */
    public void push(int x) {
        stack1.push(x); // 入栈必须栈1
    }

    /**
     * Removes the element from in front of queue and returns that element.
     */
    public int pop() {
        // 关键在pop和peek
        transform();
        return stack2.pop();
    }

    /**
     * Get the front element.
     */
    public int peek() { // 同pop，只是调用的是栈2的peek函数
        transform();
        return stack2.peek();
    }

    /**
     * 调整两个栈之前的关系
     */
    public void transform() {
        if (!stack2.isEmpty()) {
            stack2.peek();
        }
        while (!stack1.isEmpty()) {
            stack2.push(stack1.pop());
        }
    }

    /**
     * Returns whether the queue is empty.
     */
    public boolean empty() {
        return stack1.isEmpty() && stack2.isEmpty();
    }

}
